package com.sz.virtualbank.dao.mapper;

import com.sz.virtualbank.dao.entity.FinancialProduct;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

/**
 * 理财产品Mapper接口
 * 
 * @author Claude
 */
@Mapper
public interface FinancialProductMapper {
    
    /**
     * 新增理财产品
     *
     * @param product 理财产品
     * @return 影响行数
     */
    int insert(FinancialProduct product);
    
    /**
     * 更新理财产品
     *
     * @param product 理财产品
     * @return 影响行数
     */
    int update(FinancialProduct product);
    
    /**
     * 根据ID查询理财产品
     *
     * @param id 产品ID
     * @return 理财产品
     */
    FinancialProduct selectById(Long id);
    
    /**
     * 根据产品代码查询理财产品
     *
     * @param productCode 产品代码
     * @return 理财产品
     */
    FinancialProduct selectByProductCode(String productCode);
    
    /**
     * 查询理财产品列表
     *
     * @param riskLevel 风险等级（可选）
     * @param minDuration 最小投资期限（可选）
     * @param maxDuration 最大投资期限（可选）
     * @param minReturn 最小预期收益率（可选）
     * @param status 产品状态（可选）
     * @param offset 偏移量
     * @param limit 每页条数
     * @return 理财产品列表
     */
    List<FinancialProduct> selectProducts(@Param("riskLevel") Integer riskLevel,
                                        @Param("minDuration") Integer minDuration,
                                        @Param("maxDuration") Integer maxDuration,
                                        @Param("minReturn") BigDecimal minReturn,
                                        @Param("status") Integer status,
                                        @Param("offset") Integer offset,
                                        @Param("limit") Integer limit);
    
    /**
     * 统计理财产品数量
     *
     * @param riskLevel 风险等级（可选）
     * @param minDuration 最小投资期限（可选）
     * @param maxDuration 最大投资期限（可选）
     * @param minReturn 最小预期收益率（可选）
     * @param status 产品状态（可选）
     * @return 记录数量
     */
    int countProducts(@Param("riskLevel") Integer riskLevel,
                     @Param("minDuration") Integer minDuration,
                     @Param("maxDuration") Integer maxDuration,
                     @Param("minReturn") BigDecimal minReturn,
                     @Param("status") Integer status);
    
    /**
     * 更新已售金额
     *
     * @param id 产品ID
     * @param amount 增加金额
     * @return 影响行数
     */
    int increaseSoldAmount(@Param("id") Long id, @Param("amount") BigDecimal amount);
    
    /**
     * 更新产品状态
     *
     * @param id 产品ID
     * @param status 状态
     * @return 影响行数
     */
    int updateStatus(@Param("id") Long id, @Param("status") Integer status);
    
    /**
     * 查询即将到期的产品
     *
     * @param dueDate 到期日
     * @return 产品列表
     */
    List<FinancialProduct> selectByDueDate(LocalDate dueDate);
    
    /**
     * 查询热门产品（已售比例高的产品）
     *
     * @param limit 查询数量
     * @return 产品列表
     */
    List<FinancialProduct> selectHotProducts(Integer limit);
}
